package com.hang.jvm.risc.v2_memory_bus;

import com.hang.jvm.risc.v2_memory_bus.exception.LoadAccessFaultException;

import static com.hang.jvm.risc.v2_memory_bus.Param.DRAM_BASE;
import static com.hang.jvm.risc.v2_memory_bus.Param.DRAM_END;

/**
 * 总线
 */
public class Bus {

    private final Dram dram;

    public Bus(byte[] code) {
        this.dram = new Dram(code);
    }

    /**
     * 读取数据
     *
     * @param addr 地址
     * @param size 位数，只能是 8、16、32、64
     * @return 读取到的数据
     * @throws LoadAccessFaultException 读取异常
     */
    public long load(long addr, int size) throws LoadAccessFaultException {
        if (addr >= DRAM_BASE && addr <= DRAM_END) {
            return this.dram.load(addr, size);
        } else {
            throw new LoadAccessFaultException(addr);
        }
    }

    /**
     * 存储数据
     *
     * @param addr  地址
     * @param size  位数，只能是 8、16、32、64
     * @param value 要存储的数据
     */
    public void store(long addr, int size, long value) throws LoadAccessFaultException {
        if (addr >= DRAM_BASE && addr <= DRAM_END) {
            this.dram.store(addr, size, value);
        } else {
            throw new LoadAccessFaultException(addr);
        }
    }

}
